package thead;

/*
    单例模式 懒汉模式 非线程安全,需要处理
 */
class Func2 {
    private volatile Func2 func2 = new Func2();
    private Func2 getFunc2() {
        // 但是这里有线程安全问题
        if(func2 == null) {// 在外面多加一次判断,是因为 只有第一次操作 NEW对象的时候才需要加锁,后续的调用是不需要进行加锁的,只要func2 不等于空,就直接返回就可以了
            synchronized (func2) {// 该线程是保证func2 的修改的原子性,防止多次创建
                if (func2 == null) {// 这个判断只有第一次能进来,
                    func2 = new Func2();// 这里有指令重排序问题
                }
            }
        }
        return func2;
    }
    private Func2() {

    }
}
public class Demo17 {
    public static void main(String[] args) {

    }
}
